package com.fan.websocketstudy.controller;

import com.alibaba.fastjson2.JSON;
import com.fan.websocketstudy.dto.MessageDTO;
import jakarta.websocket.OnClose;
import jakarta.websocket.OnMessage;
import jakarta.websocket.OnOpen;
import jakarta.websocket.Session;
import jakarta.websocket.server.ServerEndpoint;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

// 监听哪些客户端来连接了WebSocket服务端
@ServerEndpoint("/chat/{userId}")
@Component
@Slf4j
public class WebServerEndpoint {
 
    // 因为可能有多个客户端所以这里需要保证线程安全
    static Map<String, Session> sessionMap = new ConcurrentHashMap<>();
 
    // 建立连接时执行的操作
    @OnOpen
    public void onOpen(Session session){   // 每个websocket连接对于服务端来说都是一个Session
        // 从Session中获取路径参数
        String userId = session.getPathParameters().get("userId");
        log.info("有一个用户连接了 ：当前连接的用户id是： "+ userId);

        sessionMap.put(userId, session);
        log.info("websocket is open");
    }
 
    /**
     * 收到客户端消息时执行的操作
     * @return 返回给客户端的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) {

        MessageDTO userDTO = JSON.parseObject(message, MessageDTO.class);


        Session obj = sessionMap.get(userDTO.getUserId());
        if (obj != null) {
            log.info("收到客户端消息：" + message);
            obj.getAsyncRemote().sendText(message);
        }


    }

        // 连接关闭时执行的操作
    @OnClose
    public void onClose(Session session){

        sessionMap.remove(session.getId());

        log.info("websocket is close");
    }

}